// 判断是否为 null "" undefined
export function isNullOrEmpty(value) {
  return value === null || value === "" || value === undefined;
}

export function paramsDeleteNull(array, key) {
  if (isNullOrEmpty(array[key])) {
    delete array[key];
  }
  return array;
}

// JSON 字符串转数组
export function strConvert(value) {
  return value === null || value === "" || value === undefined;
}

/**
 * 将数组转换为转义后的JSON字符串
 * @param {Array} array - 要转换的数组
 * @returns {string} 转义后的JSON字符串
 */
export function toEscapedJsonString(array) {
  if (!array) {
    return array;
  }
  // 将数组转换为JSON字符串
  const jsonString = JSON.stringify(array);
  return jsonString;
}

/**
 * 将一维数组数组转换为转义后的数组字符串
 * @param {Array} array - 要转换的数组
 * @returns {string} 转义后的JSON字符串
 */
export function toArrayString(array, separator = ",") {
  // 确保传入的是一个数组
  if (!Array.isArray(array)) {
    throw new TypeError("The input value must be an array.");
  }

  // 使用指定的分隔符将数组转换为字符串，默认是逗号
  return array.join(separator);
}

/**
 * 将转义后的JSON字符串转换回数组
 * @param {string} escapedString - 转义后的JSON字符串
 * @returns {Array} 转换后的数组
 */
export function fromEscapedJsonString(jsonString) {

  if (!jsonString) {
    return jsonString;
  }
  if (jsonString.includes("&quot")) {
    // 反转义特殊字符
    jsonString = jsonString
      .replace(/&amp;/g, "&")
      .replace(/&quot;/g, '"')
      .replace(/&apos;/g, "'")
      .replace(/&lt;/g, "<")
      .replace(/&gt;/g, ">");
    // // 将JSON字符串转换为数组
    // console.log("反转义特殊字符", jsonString);
    return JSON.parse(jsonString);
  } else {
    return JSON.parse(jsonString);
  }
}

/**
 * 将表单参数赋值给目标对象
 * @param {Object} target - 目标对象（将要被赋值的对象）
 * @param {Object} source - 源对象（包含要赋值的参数）
 */
export function assignFormParams(target, source) {
  if (isNullOrEmpty(source)) {
    return target;
  }
  for (const key in source) {
    if (source.hasOwnProperty(key)) {
      // 只赋值在目标对象中存在的键
      if (target.hasOwnProperty(key)) {
        target[key] = source[key];
      }
    }
  }
  return target;
}

export function loading() {
  return $loading({
    lock: true,
    text: "Loading",
    spinner: "el-icon-loading",
    background: "rgba(0, 0, 0, 0.7)",
  });
}

/**
 * 隐藏字符串或数字的部分内容
 *
 * @param {string|number} input - 要隐藏的字符串或数字
 * @param {string} [replacement='*'] - 替换隐藏部分的字符（默认为'*'）
 * @returns {string} - 隐藏部分内容后的字符串
 */
export function hidePart(input, replacement = "*") {
  // console.log(input,'input')
  // 将输入转换为字符串
  const str = String(input);

  // 计算要隐藏的字符数量，至少隐藏1位
  const length = str.length;
  const hideCount = Math.max(1, Math.floor(length / 3));

  if (length <= 2) {
    // 对于长度较短的字符串，直接隐藏所有字符
    return str.replace(/./g, replacement);
  }

  // 计算隐藏区域的起始和结束位置
  const start = Math.floor(length / 3);
  const end = length - Math.ceil(length / 3);

  // 构造隐藏后的字符串
  const visibleStart = str.slice(0, start);
  const hiddenPart = replacement.repeat(end - start);
  const visibleEnd = str.slice(end);

  return visibleStart + hiddenPart + visibleEnd;
}
